﻿#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QSettings>
#include <QMap>

class SerialPort : public QObject
{
    Q_OBJECT
public:
    explicit SerialPort(QSettings *settings, QObject *parent = nullptr);
    ~SerialPort();

public:
    // 扫描可用端口
    static QStringList scanSerialPort();

    //串口打开标志
    bool isOpen() const;
    //打开串口
    bool open();
    //关闭串口
    void close();
    //写入数据
    void write(const QByteArray& data);

    // 清空缓冲区
    void clear();

    // 接收缓存
    QByteArray recvBuffer() const;

private:
    void init();

private:
    // INI配置文件
    QSettings *m_settings;

    // 串口通讯及参数
    QSerialPort *m_serialPort;
    // 数据位
    QMap<int, QSerialPort::DataBits> m_dataBitsMap;
    // 停止位
    QMap<QString, QSerialPort::StopBits> m_stopBitsMap;
    // 校验位
    QMap<QString, QSerialPort::Parity> m_parityMap;
    // 流控制
    QMap<QString, QSerialPort::FlowControl> m_flowControlMap;

    // 写入超时
    int m_writeTimeout;

    // 接收缓存
    QByteArray m_recvBuffer;

signals:
    void sigErrorOccurred(QString error);
    void sigReadFinished(const QByteArray& buffer);

public slots:
    void onRead();

};

#endif // SERIALPORT_H
